Proceso para conocer y entender nuestros datos
Dpto. de Fundamentos del Análisis Económico. Universidad de Alicante
El AED es una fase inicial importante, con dos objetivos:
Conocer nuestros datos e identificar problemas → Preprocesamiento
Análisis descriptivo: identificar patrones y encontrar escenarios de análisis
NO hay una “receta”: el proceso es diferente con distintos datos o con los mismos datos para diferentes objetivos
Una consultora analiza 500 PYMES europeas fundadas entre 1980-2020 para:
Fuente de datos: pymes_europa.csv
Objetivo del AED:
Contexto: conocimiento previo de los datos (fuente, cómo están almacenados, etc.)
Cargar los datos
Reconocimiento inicial de las características:
SIEMPRE consultar el “diccionario” de datos
Verificar que las variables la información y el tipo adecuado
Detectar inconsistencias en texto, fechas, unidades, etc.
Ej.: en sector, “Tecnología”, “tecnologia”, “TECNOLOGÍA” son la misma categoría
este tipo de problemas se puede descubrir más adelante.
NAs, pero se suele preferir decidir al modelizarVariables que contienen información redundante
activos_total y total_recursos son pasivos + patrimonio_neto (igualdad contable)Otras:
Renombrar variables (para mayor claridad), generar nuevas
¿Mantenemos solo algunas variables u observaciones?
Queremos entender cómo cambian los valores de una variable entre distintas observaciones (p. e., ventas de diferentes empresas), es decir, su distribución
Aspectos a observar en la distribución
Inconsistencias: categorías erróneas (“unknown”), valores fuera de rango
Concentración de valores: ceros, números redondos o repeticiones excesivas → ¿errores o patrones reales?
Categorías: ¿tienen sentido? ¿agrupar de manera diferente? ¿reagrupar si hay pocas observaciones?
Continuas: dispersión o asimetría (usar log?); ¿discretizar (ej. grupos de edad)?
Valores inusuales (“atípicos” o “outliers”): no encajan en el patrón general
summary(), table(), mode() o con summarize(), count()# Gráfico de barras de frecuencias absolutas
g0 <- ggplot(data = pymes)
g0 + geom_bar(aes(x = pais)) +
theme(axis.text.x = element_text(angle = 90))
g0 + geom_bar( aes(x = "", fill = tipo_propiedad))
# Gráfico de barras de frecuencias relativas (proporciones)
g0 + geom_bar(aes(x = tipo_propiedad,
y = after_stat(prop), group = 1))
pymes |> count(tipo_propiedad) |> mutate(prop = n / sum(n)) |>
ggplot() + geom_bar(aes(x = tipo_propiedad, y = prop),
stat = "identity")summary()summary(pymes$ingresos)
pymes |>
summarise(
media = mean(ingresos, na.rm = TRUE),
mediana = median(ingresos, na.rm = TRUE),
sd = sd(ingresos, na.rm = TRUE),
min = min(ingresos, na.rm = TRUE),
max = max(ingresos, na.rm = TRUE),
q25 = quantile(ingresos, 0.25, na.rm = TRUE),
q75 = quantile(ingresos, 0.75, na.rm = TRUE) )Recordar: usar varios anchos de intervalo (esto es, cómo discretizar la variable continua)
Si observamos una distribución muy asimétrica, considerar escala logaritmica
Ventajas: Visión rápida, histogramas inline, NAs, estadísticos
¿Es diferente la distribución de Y (continua) por categorías de X?
#| fig-show: asis
#| fig-width: 10
#| fig-height: 5
ggplot(pymes, aes(x = ingresos, color = sector_agrupado)) +
geom_density() +
scale_x_log10(labels = scales::comma) +
theme_minimal() +
labs(title = "Distribución de Ingresos por Sector",
x = "Ingresos (miles €, escala log)",
y = "Densidad",
color = "Sector")#| fig-show: asis
#| fig-width: 10
#| fig-height: 6
ggplot(pymes, aes(x = sector_agrupado, y = ingresos, fill = sector_agrupado)) +
geom_boxplot() +
scale_y_log10(labels = scales::comma) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1),
legend.position = "none") +
labs(title = "Distribución de Ingresos por Sector",
x = "Sector", y = "Ingresos (miles €, escala log)")Observación: Tecnología y Servicios tienen medianas más altas
Interpretación:
¿Hay relación entre sector y tipo de propiedad?
#| fig-show: asis
#| fig-width: 10
#| fig-height: 5
# Visualización con barras apiladas
ggplot(pymes, aes(x = sector_agrupado, fill = tipo_propiedad)) +
geom_bar(position = "fill") +
scale_y_continuous(labels = scales::percent) +
theme_minimal() +
theme(axis.text.x = element_text(angle = 45, hjust = 1)) +
labs(title = "Tipo de Propiedad por Sector (proporciones)",
x = "Sector", y = "Proporción", fill = "Tipo Propiedad")La forma obvia de visualizar relaciones entre variables continuas es un gráfico de dispersión
#| fig-show: asis
#| fig-width: 10
#| fig-height: 6
ggplot(pymes, aes(x = activos_total, y = ingresos)) +
geom_point(alpha = 0.5, color = "steelblue") +
geom_smooth(method = "lm", color = "red", se = TRUE) +
scale_x_log10(labels = scales::comma) +
scale_y_log10(labels = scales::comma) +
theme_minimal() +
labs(title = "Relación entre Activos e Ingresos",
x = "Activos Totales (miles €, escala log)",
y = "Ingresos (miles €, escala log)")Observación: Relación positiva entre activos e ingresos
Interpretación:
activos_total e ingresos (0.82)ROE y ROA moderadamente correlacionadosempleados correlacionado con tamaño financiero#| fig-show: asis
#| fig-width: 12
#| fig-height: 10
library(corrplot)
pymes |>
select(activos_total, pasivos, patrimonio_neto, ingresos,
ebitda, beneficio_neto, liquidez_ratio, roe, roa,
deuda_patrimonio, empleados) |>
cor(use = "complete.obs") |>
corrplot(method = "color", type = "upper",
tl.col = "black", tl.srt = 45,
addCoef.col = "black", number.cex = 0.6)Las transformaciones de variables NO “caen del cielo”. Surgen del análisis previo:
Motivación del AED: - Tenemos anio_fundacion pero queremos analizar madurez - Análisis temporal reveló que empresas fundadas en diferentes décadas se comportan diferente - Para comparaciones: necesitamos años desde fundación, no año absoluto
Ahora podemos: - Comparar empresas jóvenes (< 5 años) vs consolidadas (> 15 años) - Analizar relación antigüedad-rentabilidad - Identificar si hay “valle de la muerte” para PYMEs
Motivación del AED:
Observación: Rango muy amplio (1 a 250+ empleados). Dificulta análisis.
La Unión Europea define categorías estándar para PYMES. Aplicar esta clasificación facilita: - Comparaciones con estudios previos - Comunicación con stakeholders - Segmentación de mercado
Tradeoff importante: Discretizar simplifica comunicación pero pierde información
Motivación del AED:
Del análisis bivariante vimos: - Ingresos correlacionados con empleados (r = 0.65) - Pero la relación no es proporcional - Queremos medir eficiencia: ingresos por empleado
Esta variable derivada permite: - Comparar eficiencia entre empresas de distinto tamaño - Identificar empresas sobre/sub-performando - Analizar productividad por sector (tech vs manufactura)
Insight del AED posterior: Tecnología tiene productividad 3x mayor que Manufactura
Del análisis univariante de rating_credito:
Problemas identificados: 1. CCC, CC, C, D tienen < 10 observaciones cada uno 2. Análisis bivariante mostró: C y D comportamiento financiero similar 3. No hay diferencia estadística entre BB y B en nuestros datos
Decisión de negocio: Crear tres grupos significativos
Justificación: - “Grado Inversión”: bajo riesgo, acceso fácil a financiación - “Grado Especulativo”: riesgo moderado, típico de muchas PYMES - “Alto Riesgo”: problemas financieros serios, requiere atención
Esta agrupación: - Es robusta estadísticamente (suficientes observaciones) - Tiene sentido de negocio (convención del mercado) - Facilita visualización y comunicación - Mantiene poder predictivo (verificado en análisis bivariante)
#| fig-show: asis
#| fig-width: 10
#| fig-height: 5
# Visualización agrupada
ggplot(pymes, aes(x = rating_agrupado, fill = rating_agrupado)) +
geom_bar() +
scale_fill_manual(values = c("green3", "gold2", "red2")) +
theme_minimal() +
labs(title = "Rating Crediticio Agrupado",
x = "Categoría de Riesgo", y = "Número de empresas") +
theme(legend.position = "none")Regla general: Agrupa solo cuando: 1. El análisis previo mostró que es necesario 2. Tiene sentido de negocio 3. Las categorías agrupadas tienen comportamiento similar 4. Mejora la robustez sin perder información crítica
#| fig-show: asis
#| fig-width: 10
#| fig-height: 6
# Ratio deuda/patrimonio por rating
ggplot(pymes, aes(x = rating_agrupado, y = deuda_patrimonio,
fill = rating_agrupado)) +
geom_boxplot() +
scale_fill_manual(values = c("green3", "gold2", "red2")) +
coord_cartesian(ylim = c(0, 3)) +
theme_minimal() +
labs(title = "Ratio Deuda/Patrimonio por Categoría de Riesgo",
x = "Categoría de Riesgo", y = "Ratio Deuda/Patrimonio") +
theme(legend.position = "none")Insight: Empresas de alto riesgo tienen mayor endeudamiento
El AED que hemos realizado manualmente es riguroso pero consume tiempo. ¿Podríamos automatizar partes del proceso?
La respuesta es: Sí, pero con precaución
Ventajas de herramientas automatizadas:
Limitaciones críticas:
Genera automáticamente:
Útil para: Primera exploración, compartir con no-técnicos
Limitación: 100+ páginas sin priorización
Ya usamos diagnose() y describe(), pero dlookr puede generar reportes web:
Incluye:
Útil para: Exploración técnica detallada
Limitación: Requiere entender estadística para interpretar tests
Útil para: Balance entre detalle y usabilidad
| Situación | Herramienta recomendada |
|---|---|
| Primera exploración de datos nuevos | DataExplorer::create_report() |
| Diagnóstico técnico de calidad | dlookr::diagnose() |
| Estadísticos rápidos con gráficos | skimr::skim() |
| Exploración interactiva | explore::explore() o GWalkR |
| Reportes para stakeholders | SmartEDA::ExpReport() |
| Análisis profundo experto | Manual (lo que hemos hecho) |
Ejemplo de flujo de trabajo con IA:
Usuario → IA:
"Tengo un dataset de 500 empresas europeas con variables
financieras. Quiero entender qué factores se asocian con
alta rentabilidad. El archivo es pymes_europa.csv"
IA → Usuario:
[Genera código para cargar datos, hacer EDA inicial,
visualizaciones, análisis de correlación, etc.]
Lo que hace bien:
Limitaciones críticas:
No conoce tu contexto de negocio
❌ IA: "Un ROE de 5% es bajo"
✓ Experto: "5% es normal en retail pero bajo en tech"Análisis superficial
Riesgo de “hallucinations”
❌ IA podría "inventar" patrones que no existen
❌ Interpretaciones estadísticamente incorrectas
❌ Confundir correlación con causalidadLimitación de tamaño
Dependencia de prompts
Prompt efectivo:
"Analiza pymes_europa.csv. Variables clave: ingresos, roe,
sector, pais.
Contexto: son PYMES europeas 2020-2024. Un ROE típico es
8-12%. Sectores principales: Manufactura, Servicios, Tecnología.
Pregunta de negocio: ¿Qué características tienen las empresas
con ROE > 15%?
Dame: (1) Limpieza necesaria, (2) Estadísticos descriptivos,
(3) Visualizaciones clave, (4) Análisis por sector"
Por qué es bueno: - Da contexto de negocio - Define rangos normales - Pregunta específica de negocio - Solicita análisis estructurado
Prompt malo:
"Analiza este dataset"
→ Resultado: análisis genérico sin valor
SIEMPRE:
Verifica el código generado
Valida interpretaciones
Cuestiona recomendaciones
20% del tiempo: Automatización - Herramientas de autoEDA para exploración inicial - IA para generar código estándar - Reportes automatizados para stakeholders
80% del valor: Análisis experto - Interpretación basada en conocimiento del dominio - Decisiones sobre limpieza y transformaciones - Formulación de hipótesis de negocio - Validación y crítica de hallazgos - Recomendaciones accionables
Exploración rápida (automática)
Identificar áreas de interés
Análisis manual profundo (lo que hicimos)
Usar IA como asistente
"Ayúdame a crear una visualización que compare
ROE por sector para empresas con >50 empleados,
destacando el top 10% en cada sector"Validar y documentar
❌ Usar reportes automatizados como análisis final ❌ Confiar ciegamente en interpretaciones de IA ❌ Incluir todas las visualizaciones que genera una herramienta ❌ Olvidar validar hallazgos automáticos
✓ Usar automatización como punto de partida ✓ Validar críticamente todo output automático ✓ Combinar velocidad de herramientas con expertise humano ✓ Documentar por qué una herramienta sugirió algo ✓ Mantener el contexto de negocio en el centro
Flujo real de un análisis profesional:
# 1. Exploración automática (5 min)
pymes |> skim()
diagnose(pymes) |> filter(missing_percent > 10)
# 2. Pregunta a IA (2 min)
"Sugiere visualizaciones para entender la relación
entre tamaño de empresa y rentabilidad"
# 3. Código generado por IA (revisado por ti)
ggplot(pymes, aes(x = empleados, y = roe)) +
geom_point(alpha = 0.5) +
geom_smooth(method = "loess") +
scale_x_log10()
# 4. TÚ interpretas con contexto de negocio (15 min)
# Observas que empresas 20-50 empleados tienen ROE más alto
# Investigas por qué: ¿eficiencia operativa? ¿sectores?
# Validas con análisis adicional por sector
# Formulas hipótesis de negocio
# 5. TÚ decides acción (5 min)
# "Recomendar a inversores: PYMES 20-50 empleados
# en sector Servicios muestran mejor rentabilidad..."Para dominar este enfoque:
Regla de oro: La automatización acelera, el expertise guía. Nunca al revés.
Muchas partes del AED son parcialmente “automatizables”: muchos paquetes tratan de facilitar esas partes
Radiant puede instalarse o probarse online
Algunas bibliotecas permiten explorar datos y/o realizar visualizaciones y tableros fácilmente de forma interactiva: GwalkR, explore
Informes automatizados con dlookr, DataExplorer, DataMaid, smartEDA
Algunos componentes del AED y sobre todo la interpretación del AED son específica de los datos y del objetivo del estudio